package com.xuetang9.service.a.impl;

import com.github.pagehelper.PageHelper;
import com.xuetang9.dao.WayMapper;
import com.xuetang9.domain.Way;
import com.xuetang9.dto.InputDto;
import com.xuetang9.dto.a.ListRequestDTO;
import com.xuetang9.dto.a.WayDTO;
import com.xuetang9.service.WayService;
import com.xuetang9.vo.ListVO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;

/**
 * @工能 处理线路管理模块的业务
 * @作者 杜目杰
 * @时间 2020/5/13
 * @地点 公司
 * @版本 1.0.0
 * @版权 老九学堂
 */
@Service("WayServiceImplA")
public class WayServiceImpl implements WayService {
    @Autowired
    WayMapper wayMapper;


    /**
     * 查询
     * @param inputDto  输入信息
     * @return 查询结果
     */
    @Override
    public ListVO listWayA(InputDto inputDto) {
        // 保存前端显示数据
        ListVO listVO = new ListVO();
        // 得到要处理的业务名称
        String in = inputDto.function;
        //选中对应的功能处理业务
        switch(in){
            case"查询线路":
                listVO = selectWay(inputDto);
        }
        return listVO;
    }

    /**
     * 添加
     * @param inputDto 输入信息
     * @return 添加结果
     */
    @Override
    public int insertWay(InputDto inputDto) {
        // 保存添加结果
        int result = -1 ;
        // 得到要处理的业务名称
        String in = inputDto.function;
        //选中对应的功能处理业务
        switch(in){
            case"添加线路":
                result = addWay(inputDto);
        }
        return result;
    }
    /**
     * 修改线路
     * @param inputDto 路线的信息
     * @return 修改结果
     */
    @Override
    public int updateWay(InputDto inputDto) {
        // 保存添加结果
        int result = -1 ;
        // 得到要处理的业务名称
        String in = inputDto.function;
        //选中对应的功能处理业务
        switch(in){
            case"修改线路":
                result = modifyWay(inputDto);
        }
        return result;
    }

    /**
     * 处理更新线路业务
     * @param inputDto 类型为Way的传输对象
     * @return 更新结果
     */
    private int modifyWay(InputDto<Way> inputDto) {
        // 更新数据并得到结果
        int updateReshult = updateByWay( inputDto.date);
        return updateReshult;
    }

    /**
     * 根据way中的数据更新对应的线路
     * @param way 跟新后的线路信息
     * @return 跟新结果
     */
    private int updateByWay(Way way) {
        return wayMapper.updateWay(way);
    }

    /**
     * 处理添加路线业务
     * @param inputDto 类型为线路的输入对象
     * @return 添加结果
     */
    private int addWay(InputDto<Way> inputDto) {
        int insertReshult = insertByWay( inputDto.date);
        return insertReshult;
    }

    /**
     * 添加线路
     * @param way 要添加的线路
     * @return 添加结果
     */
    private int insertByWay(Way way) {
        return wayMapper.insertWay(way);
    }

    /**
     * 处理线路查询业务
     * @param inputDto 查询线路携带的数据
     * @return 前端查询显示对象
     */
    private ListVO selectWay(InputDto<ListRequestDTO<Way>> inputDto) {
        // 保存前端显示数据
        ListVO<List> listVO = new ListVO<>();
        //开启分页
        PageHelper.startPage(inputDto.date.page,inputDto.date.pageSize);
        // 根据请求数据查询符合条件的用户
        List<Way> ways = selecByWay(inputDto.date.request);
        listVO.setResult(getWayDTOsFromWays(ways));
        return listVO;
    }

    /**
     * 根据线路表对应的查询条件查询线路
     * @param way 线路查询条件
     * @return 查询结果
     */
    private List<Way> selecByWay(Way way) {
        return  wayMapper.listWayA(way);
    }

    /**
     * 将线路信息集合提取或转化为前端需要的信息
     * @param ways 线路集合
     * @return 线路显示信息集合
     */
    private List getWayDTOsFromWays(List<Way> ways) {
        List<WayDTO> wayDTOS = new ArrayList<>();
        for (Way w: ways
             ) {
            wayDTOS.add(getWayDTOFromWay(w));
        }
        return  wayDTOS;
    }

    /**
     * 将线路信息提取或转化为前端需要的信息
     * @param way 线路
     * @return 前端显示需要的线路信息
     */
    private WayDTO getWayDTOFromWay(Way way) {
        int poleSum = 100;
        String isOpen="启用";
        String runState = "正常";
        WayDTO wayDTO = new WayDTO();
        wayDTO.setWayId(way.getWayId());
        wayDTO.setPoleSum(poleSum);
        wayDTO.setPoleFirst(way.getPoleFirst());
        wayDTO.setPoleLast(way.getPoleLast());
        wayDTO.setWayIsOpen(isOpen);
        wayDTO.setRunState(runState);
        wayDTO.setWayName(way.getWayName());
        return  wayDTO;
    }

}
